今天我們來點相對輕鬆、好理解的話題~
前幾天我們學了怎麼 git add
、git commit
,把檔案存進歷史紀錄。
但這時候你可能會發現一個問題:
👉 為什麼一堆奇怪的檔案也被 Git 跟著記錄了?
例如:
node_modules/
套件模組資料夾跟著被追蹤,整個專案瞬間變得龐大。
或者更慘,.env
裡的密碼被 commit 上去了,結果敏感資訊可能外洩 😱
那種心情真的會想立刻跑路。
其實,這些災難大多可以靠一個小小的檔案預防 —— .gitignore
。
.gitignore
?.gitignore
是一個設定檔,用來告訴 Git:
「這些檔案或資料夾不要管它,別放進版本控制。」
就像你在打包行李的時候,會先把垃圾丟掉,不會把早餐紙袋也塞進行李箱。
Git 的使命是「幫你記錄重要的版本」,但不是所有檔案都該進歷史。
舉幾個真實例子:
node_modules/
、vendor/
👉 幾百 MB,還能隨時重裝dist/
、build/
👉 反正 build 一次就有,不需要備份.env
👉 把密碼 commit 上去就等著收警告信吧.DS_Store
、Thumbs.db
👉 永遠不知道為何會出現在專案裡如果沒有過濾,專案就會變得又大又髒,甚至可能留下「黑歷史」。
在專案根目錄加一個 .gitignore
檔案,寫上規則:
# 忽略套件
node_modules/
# 忽略編譯出來的檔案
dist/
build/
# 忽略環境設定
.env
# 忽略系統垃圾
.DS_Store
Thumbs.db
之後再執行 git status
,就會發現這些檔案自動消失,不會再出現在未追蹤清單裡。
.log
👉 忽略所有 .log
結尾的檔案secret/*
👉 忽略 secret
資料夾底下的所有檔案!important.log
👉 反向規則,把 important.log
加回來有時候我們想忽略整個資料夾,但裡面又有「唯一一個檔案」要保留:
logs/*
!logs/important.log
解釋:
logs/*
會先忽略掉 logs/
底下的所有檔案!logs/important.log
再例外地把 important.log
保留下來!logs/
?你可能看到有人寫:
logs/ # 忽略整個 logs 資料夾(包含內容)
!logs/ # 取消忽略資料夾本身(讓 Git 能「看見」資料夾)。
!logs/important.log # 再指定只保留 important.log
跟上面的寫法差在哪裡?
差異點:
!logs/
):先忽略資料夾,再打開資料夾,讓 Git 往內比對規則。logs/*
):直接忽略資料夾底下的檔案(不含資料夾本身)。⚠️ 注意:Git 本來就不會追蹤空資料夾,所以 !logs/
實務上通常不是必須的。
只要用 logs/*
搭配 !logs/xxx.log
,就能「忽略大部分檔案,只保留特定檔案」。
建議:寫法 B(logs/*
+ !logs/important.log
)比較直觀,優先使用。
.gitignore
最慘的情況就是「已經 commit 上去了」。
這時候 .gitignore
不會自動把它移掉,因為檔案已經被追蹤了。
要手動解除:
git rm -r --cached node_modules/
再 commit 一次,Git 才會真的不管它。
.gitignore
,忽略掉 node_modules/
。debug.log
,試試看 .log
的規則能不能把它忽略掉。logs/important.log
,用 logs/*
+ !logs/important.log
只保留它,其他檔案忽略。.gitignore
就像專案的「過濾網」,幫你把不該進歷史的東西擋在外面。
養成習慣一開始就設定好 .gitignore
,不但讓專案更乾淨,也能避免不小心把敏感資料外流,否則你的 repo 可能會變成垃圾桶。
👉 明天開始,我們要進入 分支的世界,學習怎麼在不同開發線之間自由切換